#include "tools/post_task.h"

// 自定义任务结构体
typedef struct {
    cef_task_t task;  // 必须作为第一个成员
    SendMessageParams params;
} SendTask;

// 任务执行回调（主线程）
static void CEF_CALLBACK task_execute(struct _cef_task_t* self) {
    SendTask* my_task = (SendTask*)self;
    
    // 执行实际的消息发送
    my_task->params.frame->send_process_message(
        my_task->params.frame, 
        PID_RENDERER,
        my_task->params.response_msg
    );
    
    // 释放资源
    my_task->params.response_msg->base.release(
        (cef_base_ref_counted_t*)my_task->params.response_msg);
    free(my_task);
}

// 创建任务对象
static cef_task_t* create_task(SendMessageParams params) {
    SendTask* task = (SendTask*)calloc(1, sizeof(SendTask));
    
    // 初始化基类
    task->task.base.size = sizeof(SendTask);
    
    // 设置执行回调
    task->task.execute = task_execute;
    task->params = params;
    
    // 增加消息对象的引用计数
    params.response_msg->base.add_ref(
        (cef_base_ref_counted_t*)params.response_msg);
    
    return (cef_task_t*)task;
}

// 主接口函数
int post_send_message_task(cef_thread_id_t thread_id,
                          cef_frame_t* frame,
                          cef_process_message_t* msg) {
    SendMessageParams params = {frame, msg};
    cef_task_t* task = create_task(params);
    
    int result = cef_post_task(thread_id, task);
    
    // 投递失败时立即释放
    if (!result) {
        msg->base.release((cef_base_ref_counted_t*)msg);
        free(task);
    }
    
    return result;
}